iT邦幫忙

2023 iThome 鐵人賽

DAY 9
1

適合使用佇列(Queue)來解答的LeetCode題目,並利用這些題目來熟悉佇列的操作的題目好少,但還努力找了兩篇!


什麼是佇列(Queue)

佇列(Queue)是一種常見的資料結構,用於儲存和管理元素,與Stack不同的是,其遵循先進先出(FIFO,First-In-First-Out)的原則。也就是說:

  1. 新元素會被加入到佇列的尾部。
  2. 最早入隊的元素將被移除。
    這意味著最早加入佇列的元素將首先被處理和移除。

佇列在許多應用中都有重要作用,包括操作系統中的進程排程、計算機網絡中的數據包處理、圖算法中的廣度優先搜索等等。這種資料結構可協助保持處理順序的一致性,確保按照添加的順序進行處理。

值得注意的是,實際上佇列可以使用不同的資料結構實現,包括陣列、鏈表或其他數據結構,具體的實現方式取決於應用的需求和性能要求。

以下是一些常見的佇列操作:

  • add : 新元素新增至佇列的尾部。
  • delete :從隊列的頭部移除元素。最先入隊的元素將被移除。
  • front : 回傳柱列的前面元素
  • isEmpty: 判斷是否為空
  • isFull: 判斷是否額滿

程式碼

下面是一個使用C++演示如何使用array實現佇列的基本操作:

# include<iostream>
using namespace std;
class Queue{
    private:
        int size;
        int front;
        int rear;
        int *Q;

    public:
        Queue(int size){
        }
        bool isFull();
        bool isEmpty();
        void add(int x);
        int remove();
        int Front();
        void display();

};
bool Queue::isFull(){
    if(rear == size-1)
        return true;
    return false;
}
bool Queue::isEmpty(){
    if(front == rear)
        return true;
    return false;
}
void Queue::add(int x){
    if(isFull())
        cout << "Queue is full" << endl;
    else{
        rear++;
        Q[rear] = x;
    }
}
int Queue::remove(){
    int x = -1;
    if(isEmpty())
        cout << "Queue is empty" << endl;
    else{
        front++;
        x = Q[front];
    }
    return x;
}
void Queue::display(){
    for(int i=front+1; i<=rear; i++)
        cout << Q[i] << " ";
    cout << endl;
}
int Queue::Front(){
    if(isEmpty())
        return -1;
    return Q[front+1];
}
int main(){
    Queue q(5);
    q.add(10);
    q.add(20);
    q.add(30);
    q.add(40);
    q.add(50);
    q.display();
    cout << q.remove() << endl;
    q.display();
    cout << q.Front() << endl;
    return 0;
}



Leetcode

933. Number of Recent Calls

程度

Easy

題目

給定一個 ping 函数,每當收到一個時間戳(t),它將返回在過去 3000 毫秒內發生的請求數。
注意 : 每個測試案例都會連續呼叫 ping 函數,並且 t 的值嚴格遞增。

想法

由於這是一個先進先出(FIFO)的情境,我們可以使用佇列(Queue)來處理這個問題。由於時間戳是嚴格遞增的,我們可以在每次調用 ping 函數時將時間戳小於 t - 3000 的請求丟棄,以減少佇列的空間占用。

程式碼

class RecentCounter {
public:
    queue<int> q;
    RecentCounter() {
       
    }
    
    int ping(int t) {
         q.push(t);
        while(q.front() < t-3000)
            q.pop();
        return q.size();
    }
};

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter* obj = new RecentCounter();
 * int param_1 = obj->ping(t);
 */

[1823. Find the Winner of the Circular Game](1823. Find the Winner of the Circular Game)

程度

Medium

題目

有 n 位朋友坐成一圈玩遊戲,編號從 1 到 n,依順時針順序排列。
每次計算接下來的 k 個朋友,最後一個被數到的朋友將離開圈子,直到只剩下一位獲勝者。

想法

我們可以使用佇列(Queue)來實現這個遊戲。每次數到 k 的朋友都會被移到佇列的末尾,然後繼續數下去,直到只剩下一位玩家為止。

class Solution {
public:
    int findTheWinner(int n, int k) {
        queue<int> q;
        for(int i = 1 ; i <= n ; i ++ )
            q.push(i);

        int count=k;
        while(q.size()!=1){
            int people = q.front();
            q.pop();
            count--;
            if(count)
                q.push(people);    
            else
                count = k;
        }
        return q.front();
    }
};


上一篇
資料結構 — 堆疊(Stack)介紹
下一篇
資料結構 — 樹(Tree)
系列文
30天冒險之旅: 資料結構與演算法筆記挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言